package com.satan.juc.demo14;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: Demon
 * @Date: 2024/3/29 17:19
 * @Description:
 **/
public class ConcurrentHashMapDemo2 {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        //put(K key, V value) - 插入键值对
        map.put("apple", 10);
        //get(Object key) - 获取键对应的值
        map.get("apple"); // 返回10
        //remove(Object key) - 移除键值对
        map.remove("apple");
        //putIfAbsent(K key, V value) - 如果键不存在，则插入键值对
        map.putIfAbsent("banana", 20);
        //remove(Object key, Object value) - 如果键对应的值匹配，则移除键值对
        map.remove("banana", 20); // 如果键"banana"对应的值是20，则移除
        //replace(K key, V oldValue, V newValue) - 如果键对应的值匹配，则替换值
        map.replace("apple", 10, 30); // 如果"apple"的值是10，则替换为30
        //forEach(long parallelismThreshold, BiConsumer<? super K,? super V> action) - 对每个键值对执行操作
        map.forEach(1, (key, value) -> System.out.println(key + ": " + value));
        //search(long parallelismThreshold, BiFunction<? super K,? super V,? extends U> searchFunction) - 搜索并返回第一个非空结果
        String result = map.search(1, (key, value) -> {
            if (value > 10) return key;
            else return null;
        });
        System.out.println("result = " + result);
        //reduce(long parallelismThreshold, BiFunction<? super K,? super V,? extends T> transformer, BiFunction<? super T,? super T,? extends T> reducer) - 聚合所有键值对
        map.put("apple", 10);
        map.put("banana", 20);
        map.put("cherry", 30);
        int sum = map.reduce(1,
                (key, value) -> value, // transformer
                Integer::sum); // reducer
        System.out.println("sum = " + sum);
        //compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) - 如果指定键的值存在，计算其新值
        map.put("A", 1);
        // 如果"A"存在，将其值增加1
        map.compute("A", (key, value) -> value + 1);
        //computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) - 仅当键存在时，才计算其新值
        map.put("B", 2);
        // 如果"B"存在，将其值增加1
        map.computeIfPresent("B", (key, value) -> value + 1);
        //getOrDefault(Object key, V defaultValue) - 获取键对应的值，如果键不存在，则返回默认值
        map.put("C", 3);
        // 获取"C"的值，如果"C"不存在，返回0
        int valueC = map.getOrDefault("C", 0);
        // 获取"D"的值，如果"D"不存在，返回0
        int valueD = map.getOrDefault("D", 0);

    }
}
